# -*- coding: latin-1 -*-
#=========================================================================================
from Code.Constantes import *

from PyQt4 import QtGui, QtCore

import Code.VarGen as VarGen
import Code.ControlPosicion as ControlPosicion
import Code.Jugada as Jugada

import Code.QT.Controles as Controles
import Code.QT.Colocacion as Colocacion
import Code.QT.QTVarios as QTVarios
import Code.QT.Tablero as Tablero

#=========================================================================================
class WInfomove( QtGui.QWidget ) :
    def __init__( self, winBookGuide ) :
        QtGui.QWidget.__init__( self )

        self.winBookGuide = winBookGuide
        self.tree = winBookGuide.wmoves.tree
        self.movActual = None

        confTablero = VarGen.configuracion.confTablero( "INFOMOVEBOOKGUIDE", 32 )
        self.tablero = Tablero.Tablero(self,confTablero)
        self.tablero.crea()
        self.tablero.ponerPiezasAbajo( True )
        self.tablero.ponMensajero( self.mueveHumano )
        self.cpActual = ControlPosicion.ControlPosicion()
        self.historia = None
        self.posHistoria = None

        lybt,bt = QTVarios.lyBotonesMovimiento( self, "", siTiempo=True, siLibre=False, tamIcon=24 )

        self.lbPGN = Controles.LB( "" ).anchoFijo(self.tablero.ancho).ponWrap()

        # Valoracion
        tree = winBookGuide.wmoves.tree
        liOpciones = [ ( tit[0], k, tit[1] )  for k, tit in tree.dicValoracion.iteritems() ]
        self.lbValoracion = Controles.LB( _("Rating") + " :" )
        self.cbValoracion = Controles.CB( liOpciones, 0 ).capturaCambiado( self, self.cambiadoValoracion )

        # Ventaja
        liOpciones = [ ( tit, k, icon )  for k, (tit, icon) in tree.dicVentaja.iteritems() ]
        self.lbVentaja = Controles.LB( _("Advantage") + " :" )
        self.cbVentaja = Controles.CB( liOpciones, 0 ).capturaCambiado( self, self.cambiadoVentaja )

        # Comentario
        self.emComentario = Controles.EM(self, siHTML=False).capturaCambios( self.cambiadoComentario )

        lyVal = Colocacion.H().control(self.lbValoracion).control(self.cbValoracion).relleno(1)
        lyVen = Colocacion.H().control(self.lbVentaja).control(self.cbVentaja).relleno(1)
        lyEd = Colocacion.V().otro(lyVal).otro(lyVen).control(self.emComentario)

        lyt = Colocacion.H().relleno(1).control(self.tablero).relleno(1)

        lya = Colocacion.H().relleno(1).control(self.lbPGN).relleno(1)

        layout = Colocacion.V()
        layout.otro(lyt)
        layout.otro(lybt)
        layout.otro(lya)
        layout.otro(lyEd)
        layout.relleno(1)
        self.setLayout( layout )

        self.usoNormal = True

        self.siReloj = False

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        getattr( self, self.sender().clave )()

    #--------------------------------------------------------------------------------------------------------------------------------
    def modoNormal( self ) :
        self.usoNormal = True
        self.MoverFinal()

    #--------------------------------------------------------------------------------------------------------------------------------
    def modoPartida( self, partida, jugada ) :
        self.usoNormal = False
        self.partida = partida
        self.colocatePartida( jugada )
        self.camposEdicion( False )

    #--------------------------------------------------------------------------------------------------------------------------------
    def setBookGuide( self, bookGuide ) :
        self.bookGuide = bookGuide

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiadoValoracion( self ) :
        if self.movActual :
            self.movActual.nag( self.cbValoracion.valor() )
            self.tree.resetValoracion( self.movActual )

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiadoVentaja( self ) :
        if self.movActual :
            self.movActual.adv( self.cbVentaja.valor() )
            self.tree.resetVentaja( self.movActual )

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiadoComentario( self ) :
        if self.emComentario.hasFocus() and self.movActual :
            self.movActual.comment( self.emComentario.texto() )
            self.tree.resetComentario( self.movActual )

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambioTablero( self ) :
        pass

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponMovimiento( self, move ) :

        if self.movActual :
            self.movActual.graphics( self.tablero.exportaMovibles())

        self.movActual = move

        self.historia = move.historia()
        self.MoverFinal()

        siVisible = move != self.bookGuide.root
        self.camposEdicion( siVisible )

        if siVisible :
            self.cbValoracion.ponValor( move.nag() )
            self.cbVentaja.ponValor( move.adv() )
            self.emComentario.ponTexto( move.comment() )
            self.tablero.importaMovibles( move.graphics() )

    #--------------------------------------------------------------------------------------------------------------------------------
    def camposEdicion( self, siVisible ) :
        self.lbValoracion.setVisible( siVisible )
        self.cbValoracion.setVisible( siVisible )
        self.lbVentaja.setVisible( siVisible )
        self.cbVentaja.setVisible( siVisible )
        self.emComentario.setVisible( siVisible )

    #--------------------------------------------------------------------------------------------------------------------------------
    def mueveHumano( self, desde, hasta ) :

        if self.cpActual.siPeonCoronando( desde, hasta ) :
            coronacion = self.tablero.peonCoronando(self.cpActual.siBlancas)
        else :
            coronacion = ""

        siBien, mens, jg = Jugada.dameJugada( self.cpActual, desde, hasta, coronacion )

        if siBien :
            pv = desde+hasta+coronacion
            self.winBookGuide.seleccionaPV( pv )

    #--------------------------------------------------------------------------------------------------------------------------------
    def colocate( self, pos ) :
        if not self.historia :
            self.tablero.activaColor( True )
            return
        lh = len(self.historia)-1
        if pos >= lh :
            self.siReloj = False
            pos = lh
        if pos < 0 :
            pos = 0

        self.posHistoria = pos

        move = self.historia[self.posHistoria]
        self.cpActual.leeFen( move.fen() )
        self.tablero.ponPosicion( self.cpActual )
        pv = move.pv()
        if pv:
            self.tablero.ponFlechaSC( pv[:2], pv[2:4] )

        if self.posHistoria != lh :
            self.tablero.desactivaTodas()
        else :
            self.tablero.activaColor( self.cpActual.siBlancas )

        nh = len(self.historia)
        li = []
        for x in range(1,nh) :
            uno = self.historia[x]
            xp = uno.pgnNum()
            if x > 1 :
                if ".." in xp :
                    xp = xp.split("...")[1]
            if x == self.posHistoria :
                xp = '<span style="color:blue">%s</span>'%xp
            li.append(xp)
        pgn = " ".join(li)
        self.lbPGN.ponTexto( "<center><b>%s</b></center>"%(pgn, ) )

    #--------------------------------------------------------------------------------------------------------------------------------
    def colocatePartida( self, pos ) :
        if not self.partida.numJugadas() :
            return
        lh = self.partida.numJugadas()-1
        if pos >= lh :
            self.siReloj = False
            pos = lh
        if pos < 0 :
            pos = 0

        self.posJugada = pos

        jugada = self.partida.jugada(self.posJugada)
        posicion = jugada.posicion

        self.tablero.ponPosicion( posicion )
        self.tablero.ponFlechaSC( jugada.desde, jugada.hasta )

        self.tablero.desactivaTodas()

        p = self.partida

        numJugada = p.primeraJugada()
        pgn = ""
        if p.siEmpiezaConNegras :
            pgn += "%d... "%numJugada
            numJugada += 1
            salta = 1
        else :
            salta = 0
        for n, jg in enumerate(p.liJugadas) :
            if n%2 == salta :
                pgn += "%d."%numJugada
                numJugada += 1

            xp = jg.pgnSP()
            if n == self.posJugada :
                xp = '<span style="color:blue">%s</span>'%xp
            pgn +=  xp + " "

        self.lbPGN.ponTexto( "<center><b>%s</b></center>"%(pgn, ) )

    #--------------------------------------------------------------------------------------------------------------------------------
    def MoverInicio( self ) :
        if self.usoNormal :
            self.colocate( 0 )
        else :
            self.colocatePartida( 0 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def MoverAtras( self ) :
        if self.usoNormal :
            self.colocate( self.posHistoria - 1 )
        else :
            self.colocatePartida( self.posJugada - 1 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def MoverAdelante( self ) :
        if self.usoNormal :
            self.colocate( self.posHistoria + 1 )
        else :
            self.colocatePartida( self.posJugada + 1 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def MoverFinal( self ) :
        if self.usoNormal :
            self.colocate( len(self.historia)-1 )
        else :
            self.colocatePartida( 99999 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def MoverTiempo( self ) :
        if self.siReloj :
            self.siReloj = False
        else :
            self.siReloj = True
            if self.posHistoria >= len(self.historia)-1 :
                self.MoverInicio()
            self.lanzaReloj()

    #--------------------------------------------------------------------------------------------------------------------------------
    def lanzaReloj( self ) :
        if self.siReloj :
            self.MoverAdelante()
            QtCore.QTimer.singleShot( 1400, self.lanzaReloj )
